# -*- coding: utf-8 -*-
# 作者： 安智军
# @Time：2022/6/24 22:23
# @Email：1010666711@qq.com
# @File： 2、什么迭代器.py

# 如何判断某个对象是不是迭代器
'''
什么是迭代器 我的理解是成为迭代器前他是个可迭代对象 迭代器比可可迭代对象多了一个__next__方法


# 如何判断某个对象是不是迭代器 面试题：重要
方法一、看他有没有__next__和__iter__ 这两个属性 方法
方法二、使用 isinstance(obj2, Iterator)判断 如果返回True 则是迭代器

# 官方对于迭代器的定义
# 迭代器的协议：
1、迭代器类型必须实现__iter__和__next__ (python2中是next)
2、__iter__ 方法必须返回self
3、__next__ 方法返回下一个值 如果没有下一个值 则抛出异常
'''

from typing import Iterator  #  Iterator 迭代器类型 等价于 list tuple dict int
# isinstance 是内置函数 判断对象是不是某一个类型 返回布尔值

obj = range(1, 2)
obj2 = iter(range(1, 2))  # iter强制吧range(1, 2）转化为Iterator 迭代器类型
print(isinstance([1, 2], list))  # True
print(isinstance(obj, Iterator))  # False
print(isinstance(obj2, Iterator))  # True

# 迭代器和list有啥区别

# 先看list的属性

for attr in dir(list):
    print(attr) # __iter__


''''
__iter__  这个属性很重要 

__init_subclass__
__iter__
__le__
__len__
__lt__
__mul__
__ne__
__new__
__reduce__

'''

# 看下迭代器的属性

for attr in dir(obj2): # obj2 是个迭代器对象
    print(attr) # __next__  __iter__

'''
__init_subclass__
__iter__
__le__
__length_hint__
__lt__
__ne__
__new__
__next__

'''

# 看一个对象能不能用for操作 就看这个对象有没有 __iter__ 这个对象


